#include <gmlib/ec.h>
#include <gmlib/err.h>
#include <stdlib.h>

static char* dot_fp192[][3] = {
    // [3]G
    {
        "3241959689206761204426342363111981661731043446758629854182",  // x
        "3191151435493273541483981135250496819258126892831569605521",  // y
        "3",                                                           // k
    },
    // [51]G
    {
        "2399386719223234245175543692342806846188738807029355132631",
        "1691263994663933672006298336903549213479262517589054591671",
        "51",
    },
    // [33]G
    {
        "4647192170443755668019242104543510714810683387177116247718",
        "4068274243832424116510632981428006682351374416458153442555",
        "33",
    },
    // [6]G
    {
        "63857857110780534288982087356131627420682355233083239",
        "4352024559017642589010166816279446848827667889089777588782",
        "6",
    },
    // [84]G
    {
        "3199098669917067527173795944498389261996111238934698925020",
        "3429006222664411811484459911433211800447425802196970924761",
        "84",
    },
};

void test_ec_mul() {
    EC_CTX* ec_fp192 = &EC_Fp192_CTX;
    ECPoint d, t;
    BINT x, y, k;
    for (int i = 0; i < sizeof(dot_fp192) / sizeof(dot_fp192[0]); i++) {
        try_goto(bint_from_str(&x, dot_fp192[i][0], 10));
        try_goto(bint_from_str(&y, dot_fp192[i][1], 10));
        ec_construct(&d, &x, &y);

        try_goto(bint_from_str(&k, dot_fp192[i][2], 10));

        try_goto(ec_mul(&t, &k, &EC_Fp192_CTX.G, ec_fp192));
        if (ec_equal(&d, &t) != 1) {
            ERR_LOG("Err in ec_mul");
            printf("x=%s\n", bint_fast_to_str(&t.x, 10));
            printf("y=%s\n", bint_fast_to_str(&t.y, 10));
            goto error;
        }
    }

    return;
error:
    exit(-1);
}
